package com.oyjd.fw.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Struts2 Action基类
 * 
 * @author 欧建东
 * @email oyjd@163.com
 * 
 */
public abstract class BaseDao {

	private SessionFactory sessionFactory;

	/**
	 * 注入sessionFactory
	 * 
	 * @param sessionFactory
	 */
	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	/**
	 * 获取session
	 * 
	 * @return
	 */
	public Session getSession() {
		return sessionFactory.getCurrentSession();
	}

	/**
	 * 创建一条记录
	 * 
	 * @param obj
	 * @return
	 */
	public Serializable create(Serializable obj) {
		return getSession().save(obj);
	}

	/**
	 * 更新一条记录
	 * 
	 * @param obj
	 */
	public void update(Serializable obj) {
		getSession().update(obj);
	}

	/**
	 * 删除一条记录
	 * 
	 * @param obj
	 */
	public void delete(Serializable obj) {
		getSession().delete(obj);
	}

	/**
	 * 根据id和实体类型删除一条记录
	 * 
	 * @param c
	 * @param id
	 */
	public void deleteById(Class<?> c, Serializable id) {
		Serializable obj = queryById(c, id);
		if (null != obj) {
			delete(obj);
		}
	}

	/**
	 * 删除某个实体的所有记录
	 * 
	 * @param c
	 */
	public void deleteAll(Class<?> c) {
		Query query = getSession().createQuery("delete " + c.getName());
		query.executeUpdate();
	}

	/**
	 * 根据id和实体类型查询一条记录
	 * 
	 * @param c
	 * @param id
	 * @return
	 */
	public Serializable queryById(Class<?> c, Serializable id) {
		return (Serializable) getSession().get(c, id);
	}

	/**
	 * 查询某张表的所有记录
	 * 
	 * @param c
	 * @return
	 */
	public List<?> queryAll(Class<?> c) {
		return getSession().createQuery("from " + c.getName()).list();
	}

	/**
	 * 查询表记录数
	 * 
	 * @param c
	 * @return
	 */
	public long queryTotalCount(Class<?> c) {
		Query query = getSession().createQuery("select count(o) from " + c.getName() + " o");
		return ((Long) query.uniqueResult()).longValue();
	}

	/**
	 * 分页查询
	 * 
	 * @param c
	 * @param pageSize
	 * @param pageNum
	 * @return
	 */
	public List<?> queryPage(Class<?> c, int pageSize, int pageNum) {
		Query query = getSession().createQuery("from " + c.getName());
		query.setFirstResult((pageNum - 1) * pageSize);
		query.setMaxResults(pageSize);
		return query.list();
	}

	/**
	 * 判断一条记录是否存在
	 * 
	 * @param c
	 * @param id
	 * @return
	 */
	public boolean exist(Class<?> c, Serializable id) {
		return null != queryById(c, id);
	}

	/**
	 * 根据hql执行查询
	 * 
	 * @param hql
	 * @return
	 */
	public List<?> queryByHql(String hql) {
		return queryByHql(hql, null);
	}

	/**
	 * 根据hql和动态参数执行查询
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	public List<?> queryByHql(String hql, Object[] args) {
		Query query = getSession().createQuery(hql);
		if (null != args) {
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i, args[i]);
			}
		}
		return query.list();
	}

	/**
	 * 根据hql执行查询一个对象
	 * 
	 * @param hql
	 * @return
	 */
	public Object queryOneByHql(String hql) {
		return queryOneByHql(hql, null);
	}

	/**
	 * 根据hql和动态参数执行查询一个对象
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public Object queryOneByHql(String hql, Object[] args) {
		Object result = null;
		Query query = getSession().createQuery(hql);
		if (null != args) {
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i, args[i]);
			}
		}
		List tmpList = query.list();
		if (tmpList.size() > 0) {
			result = tmpList.get(0);
		}
		return result;
	}

	/**
	 * 根据hql执行
	 * 
	 * @param hql
	 * @return
	 */
	public int executeHql(String hql) {
		return executeHql(hql, null);
	}

	/**
	 * 根据hql和动态参数执行
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	public int executeHql(String hql, Object[] args) {
		Query query = getSession().createQuery(hql);
		if (null != args) {
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i, args[i]);
			}
		}
		return query.executeUpdate();
	}

	/**
	 * 执行sql
	 * 
	 * @param sql
	 */
	public void executeSql(String sql) {
		SQLQuery query = getSession().createSQLQuery(sql);
		query.executeUpdate();
	}

}
